07 - Returning State/04 - Callback Chaining.js (38 lines of code) (raw):
let Foo = (props, state = { dir: 1 }, update) => {
function *handleToggle() {
if (props.isActive) {
// Invert direction
var dir = -state.dir;
yield update({ ...state });
yield props.onToggle(dir);
}
return update(state);
};
return <div onClick={handleToggle} />;
};
type Props = { addition ?: number };
type State = { counter : number };
export type Bar = (Props, State, Update) => Element;
export let Bar : Bar = (props, state = { counter: 0 }, update) => {
let { addition = 1 } = props; // Default props
let handleToggle = (value) => update({ ...state, counter: state.counter + value });
let handleClick = () => {
return update({ ...state, counter: state.counter + addition });
};
return (
<div onClick={handleClick}>
<Foo onToggle={handleToggle} isActive />
</div>
);
};
// Language trickery to get named arguments, default props and initial state
// This is so not readable.
// props : defaultProps : type definition
// state = initialProps : type definition
let Baz = ({
props : { addition = 5 } : { addition : number },
state = { counter : 1 } : { counter : number },
update : Update,
context : any
}) => {
return <Bar addition={addition} />;
};